home *** CD-ROM | disk | FTP | other *** search
/ Chip 1996 April / CHIP 1996 aprilis (CD06).zip / CHIP_CD06.ISO / hypertxt.arj / 9406 / 386_1.CD next >
Text File  |  1994-11-27  |  21KB  |  428 lines

  1.           @VA   80286   és   80386  processzorok  valós  módú@N
  2.           @Vlehetôségei@N
  3.  
  4.           @VModern idôk -- I.@N
  5.  
  6.           Az    egyre   újabb   típusú   processzorok   megjelenésével
  7.           gyakori      probléma     a     leírások     hiánya     vagy
  8.           hiányossága,  esetleg  félrevezetô  volta.  Cikksorozatomban
  9.           szeretnék   az   assembly  programozást  kedvelô  olvasóknak
  10.           rövid   betekintést  adni  a  80286  és  80386  processzorok
  11.           által      nyújtott     új     lehetôségekbe.     @K(Tördelési@N
  12.           @Kokokból    az    assembly    forrásmintákban    a    sorvégi@N
  13.           @Kkommenteket   az  utasítások   elôtti  sorba  raktuk,  végén@N
  14.           @Kkettôsponttal -- a Szerk.)@N
  15.  
  16.  
  17.  
  18.           Az  alábbiak  megértéséhez a 8088 processzor assembly nyelvû
  19.           programozásának  ismerete  szükséges.  A  8088-ról  már  sok
  20.           szakkönyv  jelent  meg magyar nyelven is, így viszonylag jól
  21.           dokumentáltnak tekinthetô.
  22.  
  23.  
  24.              @V***** I. ùjdonságok a 80286 valós módjában *****@N
  25.  
  26.                          @VBôvített utasításkészlet@N
  27.  
  28.           @VENTER    variables,    level@N   Magasszintû   nyelvek   stack
  29.           keretének   létrehozása.   Az  utasítás  lehetôvé  teszi  az
  30.           egybeágyazott   funkciók   számára  egymás  stack  területén
  31.           elhelyezett   lokális   változóinak  elérését.  Mûködése  az
  32.           alábbi    algoritmus   alapján   megérthetô.   FRAME_PTR   a
  33.           processzor   belsô   munkaváltozója,  amelyben  SP  átmeneti
  34.           tárolását   végzi.   Ha   level   értéke  nulla,  akkor  nem
  35.           egybeágyazott  funkcióról  van  szó,  vagy  a  rendszer  nem
  36.           használja  ezt  a  lehetôséget. Ellenkezô esetben a legkülsô
  37.           egybeágyazási szint az 1.
  38.  
  39.            @KPUSH BP@N
  40.           @K FRAME_PTR = SP@N
  41.           @K if level > 0 then@N
  42.           @K repeat (level-1)-szer:@N
  43.           @K BP = BP - 2@N
  44.           @K PUSH WORD PTR [BP]@N
  45.           @K end repeat@N
  46.           @K PUSH FRAME_PTR@N
  47.           @K end if@N
  48.           @K BP = FRAME_PTR@N
  49.           @K SP = SP - variables@N
  50.  
  51.           Példa az utasítás használatára:
  52.  
  53.            @K; 16 byte méretû lokális@N
  54.           @K ; változóterület létrehozása@N
  55.           @K ; funkció egybeágyazás@N
  56.           @K ; (BP másolás) nélkül:@N
  57.           @K ENTER 16,0@N
  58.  
  59.           @VLEAVE@N   Az  ENTER  utasítás  által  létrehozott  stack-keret
  60.           törlése   visszatérés   elôtt.   Az   átadott  paramétereket
  61.           magunknak  kell  kitörölni  RET  n  vagy  ADD  SP,n utasítás
  62.           használatával.  ENTER  és  LEAVE  között BP értékét meg kell
  63.           ôrizni! Az utasítás mûködése:
  64.  
  65.            @KMOV SP,BP@N
  66.           @K POP BP@N
  67.  
  68.           @VBOUND     reg16,     bounds_address@N    Intervallum-vizsgálat
  69.           egyetlen   utasítással.  Ha  a  vizsgálandó  tizenhat  bites
  70.           regiszter értéke  kisebb mint WORD PTR [bounds_address] vagy
  71.           nagyobb  mint  WORD  PTR [bounds_address+2], akkor INT 5 jön
  72.           létre.   Az   utasítás  a  regisztert  és  a  határértékeket
  73.           egyaránt   elôjelesen  értelmezi.  Alkalmas  tömbök  és  más
  74.           adatterületek  címzés  elôtti  határvizsgálatára.  Példa  az
  75.           utasítás használatára:
  76.  
  77.            @K; Ha DI<[BP+28] vagy@N
  78.           @K ; DI>[BP+30], akkor INT 5:@N
  79.           @K BOUND DI,[BP+28]@N
  80.  
  81.           @VIMUL   dest,  r/m,  immed@N  Åltalánosított  szorzó  utasítás,
  82.           amely  alkalmas  egy  memóriaváltozó  vagy  regiszter és egy
  83.           konstans  szorzatának  bármely  általános  regiszterbe  való
  84.           betöltésére  más regiszterek felhasználása nélkül. A szorzás
  85.           elôjeles,  így  minden  paramétere  elôjelesen éretelmezett.
  86.           Dest  és  r/m operandusok 16 bitesek, míg a konstans érték 8
  87.           vagy  16  bites  lehet.  Ha  immed  8  bites,  a  processzor
  88.           automatikus  16  bitre  való elôjelkiterjesztést hajt végre.
  89.           Ha  a szorzás során az eredmény nem tárolt felsô 16 bitje is
  90.           értékes  jegyeket  tartalmazott (nem volt egyenlô az alsó 16
  91.           bit  elôjelkiterjesztésével),  akkor  a Carry és az Overflow
  92.           bit  1  értékû  lesz.  Érvényes eredmény esetén mindkét flag
  93.           törlôdik. Példa az utasítás használatára:
  94.  
  95.            @KIMUL DI,Y_COORD,320@N
  96.  
  97.           @VOUTS,  INS@N  E  két  utasítással  az eddig megszokott blokkos
  98.           memóriamûveletekhez  hasonló I/O mûveletek valósíthatók meg.
  99.           OUTS  alapértelmezetten  DS:[SI] címrôl  veszi  a  DX  címû
  100.           portra  kiküldendô byte-ot  vagy  szót, INS az ES:[DI] címre
  101.           tölti  le  a  DX címû portról beolvasott értéket. SI illetve
  102.           DI  a  direction  flag  állásától függôen nô vagy csökken az
  103.           alkalmazott   adathosszal.   REP   prefixum  használható  az
  104.           utasítás   CX-ben   megadott  számú  ismétlésére.  Példa  az
  105.           utasítás használatára:
  106.  
  107.            @KMOV AX,INPUT_SEG@N
  108.           @K MOV ES,AX@N
  109.           @K MOV DI,OFFSET BUFFER1@N
  110.           @K MOV DX,PORT_ADDR@N
  111.           @K MOV CX,BLOCK_LEN@N
  112.           @K CLD@N
  113.           @K REP INSB@N
  114.  
  115.           @VPUSHA@N  Az  AX,  BX,  CX,  DX,  SI,  DI, BP, SP regisztereket
  116.           elmenti  a  stackre,  a  felsorolással megegyezô sorrendben.
  117.           Igen  hasznos  lehet interrupt-kezelô eljárások belépésénél.
  118.           Mindig    figyeljünk    arra,    hogy    az    utasítás    a
  119.           szegmensregiszterek értékeit nem menti el!
  120.  
  121.           @VPOPA@N   A   PUSHA  utasítással  stackre  mentett  regiszterek
  122.           visszatöltése.
  123.  
  124.           @Vùj,   többszörös   biteltolási   lehetôség@N   A  80286-nál  a
  125.           biteltoló   utasításokban  egynél  nagyobb  értékû  eltolási
  126.           konstans  is  megadható.  A  konstans 8 bites elôjel nélküli
  127.           számként  értelmezôdik,  emiatt  negatív  eltolás megadása a
  128.           ROR  és  a  ROL  kivételével  nem  jár  helyes  eredménnyel.
  129.           Minden    eltolás    egy    plusz   órajelciklust   igényel.
  130.           Értelmezett  és  helyesen  végrehajtható  a  nulla  eltolás.
  131.           Egynél  több  biteltolás  esetén  az  Overflow  flag  állása
  132.           határozatlan. Példák az utasításra:
  133.  
  134.            @KSHR AX,3@N
  135.           @K SHL BP,8@N
  136.  
  137.                               @Vùj regiszterek@N
  138.  
  139.           A  80286  új  regisztereinek  többsége  az  itt nem tárgyalt
  140.           védett  módú  tárkezeléssel  kapcsolatos. Az egyetlen, valós
  141.           módban  is  hasznos  regiszter az MSW (Machine Status Word),
  142.           amelyben  az  EM bit (2. bit) beállításával lehetôség nyílik
  143.           valós módú 80287 emulációra.
  144.  
  145.                       @VVáltozások a stack kezelésében@N
  146.  
  147.           A   80286  védett  módú  tárkezelése  szükségessé  tette  az
  148.           utasítás   végrehajtása   alatt   keletkezô   hibák  korrekt
  149.           kezelését.  Mivel ilyen esetben az utasítás végrehajtása nem
  150.           folytatható  helyesen,  a  processzor  a hibaoknak megfelelô
  151.           interruptot   aktivizálja.  Ezen  interruptokat  kizárásnak,
  152.           angolul     exceptionnek     nevezzük.     A     hibakezelés
  153.           megkönnyítésére   a  visszatérési  cím  a  hibás  utasításra
  154.           mutat.  Valós  módban  ilyen hiba lehet egy értelmezhetetlen
  155.           utasítás    futtatására    tett   kísérlet,   vagy   osztási
  156.           túlcsordulás   létrejötte.  A  8088  processzor  a  kérdéses
  157.           utasítás    @Kmögé@N    mutató    címet   helyezte   a   stackre
  158.           visszatérési címként, a 80286-tal ellentétben.
  159.  
  160.           A  PUSH  SP utasítás 8088-on SP kettôvel csökkentett értékét
  161.           helyezte  a  stackre,  míg  a  80286  már az eredeti értéket
  162.           tárolja.  POP  SP  értelmezése  megfelel az adott processzor
  163.           PUSH  SP-vel  tárolt  értékének.  Ha programunkat 8088-on is
  164.           futtatni    szeretnénk,    és    az   SP   stackre   mentése
  165.           elkerülhetetlen,   akkor   használjuk   PUSH  SP  helyett  a
  166.           következô    három    utasítást    a    8088    féle   stack
  167.           megvalósítására:
  168.  
  169.            @KPUSH BP@N
  170.           @K MOV BP,SP@N
  171.           @K XCHG BP,[BP]@N
  172.  
  173.           POP   SP   helyett  használjunk  két  INC  SP  utasítást  az
  174.           esetleges stack-hiba elkerülésére.
  175.  
  176.                      @V@KJavítások a 8088-hoz képest@N@V@N
  177.  
  178.           A  8088  nem  volt  képes  a  legnagyobb  negatív szám (-80H
  179.           illetve     -8000H)    szolgáltatására    elôjeles    osztás
  180.           eredményeként.  Ehelyett  osztási  túlcsordulás  jött létre.
  181.           Ezt a hibát a 80286-ban kijavították.
  182.  
  183.           Egyes  régebbi  8088  processzorok nem tiltották helyesen az
  184.           interrupt  kéréseket  a  következô  utasítás végrehajtásának
  185.           idejére  MOV  SS,r/m utasítás után, ami stackhibát hozhatott
  186.           létre  a  félig  beírt  stack-mutató  miatt.  A  80286-ban a
  187.           hibát kijavították.
  188.  
  189.                    @VTanácsok a (hatékonyabb) kód írásához@N
  190.  
  191.           A  80286  valós  módú  szolgáltatásainak  fordítását  a TASM
  192.           illetve MASM fordítókon .286c paranccsal engedélyezni kell.
  193.  
  194.           A  80286  memóriakezelése  teljesen 16 bites, így a páratlan
  195.           címre  helyezett  szavas  adatok  elérési  ideje 2 órajellel
  196.           hosszabb.  Emiatt  célszerû  szavas  adatainkat  páros címen
  197.           tárolni  (TASM/MASM  fordítók  EVEN  vagy ALIGN 2 parancsa),
  198.           valamint programunk elején SP értékét párosra beállítani.
  199.  
  200.           Ahol   csak   lehet,  tároljuk  változóinkat  és  adatainkat
  201.           regiszterekben.   A   regiszterek   kiosztását  bonyolultabb
  202.           ciklusokban   célszerû   papíron   megtervezni.  Kerüljük  a
  203.           felesleges  PUSH  és  POP  mûveleteket, ahol lehet, mentsünk
  204.           regiszterbe.  Kerüljük  a  felesleges ugrásokat, különösen a
  205.           nagy  ciklusszámú hurkokban. A processzor ilyenkor kénytelen
  206.           a  teljes 9 byte-os queue-t újra beolvasni. Sokszor célszerû
  207.           kis  méretû  és  korlátozott  ciklusszámú, de sokszor hívott
  208.           cilusainkat  LOOP  használata  helyett  többször  egymásután
  209.           fordítani, például a REPT parancs használatával:
  210.  
  211.            @KREPT 10@N
  212.           @K STOSB@N
  213.           @K INC AL@N
  214.           @K ENDM@N
  215.  
  216.  
  217.              @V***** II. ùjdonságok a 80386 valós módjában *****@N
  218.  
  219.                   @V32 bites regiszterkészlet és aritmetika@N
  220.  
  221.           A  80386 tudása és utasításvégrehajtási sebessége lényegesen
  222.           nagyobb  elôdeinél.  32  bites  regiszterkészlete  és  belsô
  223.           felépítése   nagyobb  számítási  pontosságot  és  sebességet
  224.           jelent  a  valós  módú programoknak is. A 80386 valós módban
  225.           @<9406\386_1.GIF>használható regiszterei az ábrán láthatók.@N
  226.  
  227.           Az  új  32  bites  regiszterek és utasítások a .386c parancs
  228.           kiadása  után használhatók. Kódszegmenseink definíciójában a
  229.           SEGMENT  parancs végén mindig használjuk a USE16 paramétert.
  230.           A   32   bites   regiszterek   használata   külön   cím-  és
  231.           adathosszváltó  prefixummal  valósul meg, ami lehetôvé teszi
  232.           egyetlen  utasításon  belül  az operandusok hosszának szabad
  233.           megválasztását.  A  hosszváltó  prefixek  hatására 8 helyett
  234.           16,  16  helyett 32 bites adat- vagy címkezelés valósul meg.
  235.           A  32  bites  regiszterek  bármelyike  szabadon  használható
  236.           címzésre  akár  index-,  akár  bázisregiszterként.  32 bites
  237.           címzés  esetén  lehetôség van az indexregiszter 1, 2, 4 vagy
  238.           8-cal   való   szorzására   a   címszámítás   során.   Ez  a
  239.           skálafaktor,  melyet  néhány  alábbi  példában is láthatunk.
  240.           Példák 32 bites adatokat és címeket kezelô utasításokra:
  241.  
  242.            @KMOV EAX,12345678H@N
  243.           @K ROR EAX,16@N
  244.           @K MOV BL,FS:[EAX]@N
  245.           @K MOV [EBX*4],EAX@N
  246.           @K MOV DWORD PTR DS:[046CH],0F0FA5A5H@N
  247.           @K MOV BX,CS:JUMPTABLE[ECX+ESI*2]@N
  248.  
  249.                   @Vùj utasítások@N
  250.  
  251.           @VCWDE@N    Az    AX   regisztert   elôjelkiterjeszti   az   EAX
  252.           regiszterbe.   16   bites   elôjeles   értékek   32  bitessé
  253.           alakítására hsználható.
  254.  
  255.           @VCDQ@N   Az   EAX   regisztert   elôjelkiterjeszti  EDX:EAX  64
  256.           bites    értékké.    Elôjeles   32   bites   osztás   esetén
  257.           használható:
  258.  
  259.            @K; Osztandó elôjeles érték:@N
  260.           @K@N
  261.           @K MOV EAX,SIGNED_VALUE@N
  262.           @K ; Osztó (32 bit):@N
  263.           @K MOV EBX,DIVIDER@N
  264.           @K ; EAX -> EDX:EAX:@N
  265.           @K CDQ@N
  266.           @K ; EAX (hányados),EDX (maradék)=(EDX:EAX)/EBX:@N
  267.           @K IDIV EBX@N
  268.  
  269.           @VBT   r/m,bitnum@N   A   Carry   flagbe   másolja   r/m  bitnum
  270.           sorszámú  bitjét.  A  legalacsonyabb  bit  a 0. sorszámú. Az
  271.           utasítás  bitnum  értékét  r/m  adathosszával  modulo  veszi
  272.           figyelembe.  Bitnum  megadható  8  bites  regiszterben  vagy
  273.           direkt értékként.
  274.  
  275.           @VBTR   r/m,bitnum@N   Mint   BT,  de  vizsgálat  után  törli  a
  276.           kérdéses bitet.
  277.  
  278.           @VBTS  r/m,bitnum@N  Mint  BT,  de  vizsgálat  után 1-be állítja
  279.           a kérdéses bitet.
  280.  
  281.           @VBTC     r/m,bitnum@N    Mint    BT,    de    vizsgálat    után
  282.           komplementálja a kérdéses bitet.
  283.  
  284.           @VBSF   reg8,src@N   Az   utasítás  az  src  16  vagy  32  bites
  285.           memória   vagy   regiszter   operandusában  elôforduló  alsó
  286.           bitszámok  felôli  elsô  egyes  bit  sorszámát  tölti a reg8
  287.           nyolc  bites  regiszterbe. Ha src értéke nulla volt (nincsen
  288.           benne   egyes   bit),  akkor  ZF=1  lesz  és  reg8  tartalma
  289.           határozatlan. Ellenkezô esetben ZF=0.
  290.  
  291.           @VBSR   reg8,src@N   Mint  BSF,  de  a  magasabb  bitektôl  (15.
  292.           vagy  31.) kezdve keres. A bitek sorszáma nem függ a keresés
  293.           irányától.
  294.  
  295.           @VSHLD  r/m,reg,bitnum@N  Az  utasítás  r/m  16  vagy  32  bites
  296.           operandust  balra  lépteti  bitnum  bittel, eközben a belépô
  297.           bitekbe  reg  felsô  bitjeit  lépteti.  Bitnum lehet 8 bites
  298.           elôjel  nélküli  direkt  érték,  vagy  a  CL  regiszter.  Az
  299.           utasítás  nem  változtatja  meg  a reg tartalmát. R/m és reg
  300.           mezôk  adathossza  azonos  kell  legyen. A Sign, a Zero és a
  301.           Parity    jelzôbit    az   r/m-ben   megjelenô   eredménynek
  302.           megfelelôen   állítódik   be.   Az   Overflow   flag  értéke
  303.           határozatlan.
  304.  
  305.           @VSHRD   r/m,reg,bitnum@N   Mint  SHLD,  azonban  r/m-et  jobbra
  306.           tolva reg alsó bitjeit lépteti be.
  307.  
  308.           @VMOVSX    op1,op2@N    Elôjelkiterjesztéssel    másolja   op2-t
  309.           op1-be.   Alkalmas  8  bites  elôjeles  adatok  16  vagy  32
  310.           bitessé,   illetve  16  bites  elôjeles  adatok  32  bitessé
  311.           bôvítésére.   Az  utasítás  paraméterezési  korlátai  --  az
  312.           eltérô  adathosszt  kivéve  -- azonosak a MOV-éval. Példa az
  313.           utasítás használatára:
  314.  
  315.            @K; BL elôjelkiterjesztett bemásolása EAX-be:@N
  316.           @K MOVSX EAX,BL@N
  317.  
  318.           @VMOVZX  op1,op2@N  Mint  MOVSX,  de  zéró  bitekkel egészíti ki
  319.           op2-t.
  320.  
  321.           @VLSS  reg,ptr;  LDS  reg,ptr;  LES  reg,ptr; LFS reg,ptr; LGS@N
  322.           @Vreg,ptr@N  Ezekkel az  utasításokkal  távoli  mutató  tölthetô
  323.           be   egy   16  vagy  32  bites  ofszet  regiszterbe  és  egy
  324.           szegmensregiszterbe.  A  mutató 32 vagy 48 bites lehet attól
  325.           függôen,  hogy  ofszet  része  16  vagy  32  bites. A két új
  326.           szegmensregiszter  (FS,  GS) ES-sel megegyezôen használható.
  327.           Példa az utasítás használatára:
  328.  
  329.            @K; 32 bites töltés START_STACK-bôl SS:SP-be:@N
  330.           @K LSS SP,START_STACK@N
  331.           @K ; 48 bites töltés DEST_PTR-bôl ES:EDI-be:@N
  332.           @K LES EDI,DEST_PTR@N
  333.           @K ; 32 bites töltés IMAGEDATA-ból GS:BX-be:@N
  334.           @K LGS BX,IMAGEDATA@N
  335.  
  336.           @VIMUL   dest,   r/m@N   Az  IMUL  utasítás  általános  formája,
  337.           amely  lehetôvé  teszi  dest  16  vagy  32  bites  regiszter
  338.           elôjeles   szorzását  azonos  adathosszú  regiszterrel  vagy
  339.           memóriaváltozóval.  Az  utasítás elôjeles számként értelmezi
  340.           mindegyik  paraméterét.  Ha  a  végeredmény  nem ábrázolható
  341.           helyesen  a megadott célregiszterben, az Overflow és a Carry
  342.           jelzôbitet  az  utasítás  egybe  állítja.  Ellenkezô esetben
  343.           mindkét flag törlôdik. Példa az utasításra:
  344.  
  345.            @K; ECX := ECX*EBP:@N
  346.           @K IMUL ECX,EBP@N
  347.  
  348.           @VPUSHAD@N   Az   EAX,   EBX,  ECX,  EDX,  ESI,  EDI,  EBP,  ESP
  349.           regiszterek   stackre   mentése   egyetlen   utasítással,  a
  350.           felsorolással megegyezô sorrendben.
  351.  
  352.           @VPOPAD@N  A  PUSHAD  utasítással  stackre  mentett  regiszterek
  353.           visszatöltése.
  354.  
  355.           @VHosszú   feltételes   ugrások@N   A   80386   lehetôvé   teszi
  356.           feltételes   ugrások   végrehajtását   a   teljes   aktuális
  357.           kódszegmensben,  ami megkíméli a programozót a ""Jump out of
  358.           range"  bosszúságaitól.  A  LOOP  és a JCXZ, valamint összes
  359.           változatuk sajnos még mindig csak a rövid ugrást támogatja.
  360.  
  361.           @VSETcc   reg8@N   Az  utasítás  egyet  tölt  reg8  nyolc  bites
  362.           regiszterbe,  ha  a  cc  feltétel (lásd Jcc ugró utasítások)
  363.           igaz,  ellenkezô  esetben az eredmény nulla. Nem használható
  364.           a SETCXZ illetve SETECXZ utasítás. Példa az utasításra:
  365.  
  366.            @K; AL=1 NZ, AL=0 Z esetén:@N
  367.           @K SETNZ AL@N
  368.  
  369.           @VJECXZ@N   JCXZ   32  bites  megfelelôje,  amely  ECX=0  esetén
  370.           ugrik.
  371.  
  372.           @VLOOPD@N    ECX   ciklusszámlálóval   mûködö   LOOP   utasítás.
  373.           Használható LOOPDZ, LOOPDNZ, LOOPDE, LOOPDNE variációja is.
  374.  
  375.           @VREP@N  Ha  a  blokk  utasítás  által használt címek 32 bitesek
  376.           (ESI  vagy  EDI), ciklusszámlálóként automatikusan ECX, mint
  377.           32  bites  számláló  kerül felhasználásra. ECX kiválasztását
  378.           az   adathossz   nem  befolyásolja.  Példa  CX  illetve  ECX
  379.           felhasználására blokkutasításban:
  380.  
  381.            @K; ES:[EDI] címen ECX byte feltöltése AL-lel:@N
  382.           @K REP STOS BYTE PTR ES:[EDI]@N
  383.           @K ; ES:[DI] címen CX byte feltöltése AL-lel:@N
  384.           @K REP STOS BYTE PTR ES:[DI]@N
  385.  
  386.  
  387.                                  @VCímhibák@N
  388.  
  389.           32   bites   regiszterek   címzésre   való  felhasználásával
  390.           lehetôség  nyílik  arra,  hogy az eredô ofszet túlmutasson a
  391.           64  Kbyte-os  valós  módú  szegmenshatáron.  A szegmenslimit
  392.           átlépése  elôfordulhat  szavas  vagy  duplaszavas adatcímzés
  393.           esetén   is,  ha  az  adat  bármely  byte-ja  kívül  esik  a
  394.           szegmenshatáron.  Ez  jelentôs  eltérés  a 80286-hoz képest,
  395.           amire feltétlenül figyelni kell.
  396.  
  397.  
  398.                   @VA 80386 szigorításai a 80286-hoz képest@N
  399.  
  400.           A  80386 processzor 15 byte-nál hosszabb utasítás dekódolása
  401.           esetén  EXC  6-ot hoz létre (illegális utasítás kizárás). 16
  402.           byte-os    hossz    azonban    csak    felesleges   prefixek
  403.           felhasználásával érhetô el.
  404.  
  405.           LOCK  prefixum  csak XCHG, BT, BTC, BTS, BTR, ADD, SUB, ADC,
  406.           SBB,  OR,  AND,  XOR,  INC,  DEC,  NOT, NEG utasítások elôtt
  407.           megengedett.  XCHG  alatt  a  processzor  automatikusan LOCK
  408.           állapotba kerül.
  409.  
  410.           A  80386  biteltoló utasításai modulo 32 veszik figyelembe a
  411.           biteltolások értékeit.
  412.  
  413.  
  414.               @VTanácsok és javaslatok hatékonyabb kód írásához@N
  415.  
  416.           A   80386  CPU  barrel-shifter  áramkörének  segítségével  a
  417.           biteltolásokat  bitszámtól  függetlenül  azonos  idôk  alatt
  418.           hajtja    végre,    ezért    a    16    bites    regiszterek
  419.           mentése-visszatöltése  rugalmasabb  és  gyorsabb  a 32 bites
  420.           regiszter   két   felének   ROR  vagy  ROL  paranccsal  való
  421.           csereberélésével mint a PUSH-POP páros használatával.
  422.  
  423.           80386DX-nél  32  bites  a  memória  elérése,  ami  32  bites
  424.           adataink  néggyel  osztható  címre  való  elhelyezését teszi
  425.           célszerûvé  (ALIGN  4  parancs).  Ügyeljünk  arra,  hogy  SP
  426.           értéke mindig legalább páros legyen.
  427.  
  428.           @KFerenczi Viktor@N